// 知识点补充

// 万物皆对象： 字符串继承了String的属性和方法，str.length代表字符串的长度
// let str = '123';
// let str2 = new String('123');
// str.startsWith()  // startsWith是那里来的？ 原型

/*
  学习目标：泛型约束
  语法： <T extends IXxxx>
  作用：T一定具有IXxx身上的属性
  理解上：🔔exnteds 最好理解为逻辑且，表示不仅是什么，还是什么 
*/

// 1. 定义一个对象结构
// interface ILength {
//   length: number;
// }

type MyObj = {
  length: number;
};

// 2. 使用extends关键字，添加约束条件
// 告诉TS，我的泛型T，一定会有length属性。如果没有lenth，调用时报错
function getValue<T extends MyObj>(value: T): T {
  // T代表的是捕获到的类型，有可能是任意类型，TS在提示，有些类型身上没有length属性
  console.log('value.length  ----->  ', value.length);
  return value;
}

const str3 = getValue('123');
const list = getValue([]);
const obj = getValue({
  length: 123,
  name: '123',
});

// 要求报错
// const bool = getValue(true);
